<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>state</title>
  </head>
  <body>
    <div id="test">我是一段文本</div>

    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>

    <script>
      function handleClick() {
        console.log('你点击了当前标签')
      }
    </script>

    <script type="text/babel">
      // 创建 Weather 组件
      class Weather extends React.Component {
        constructor(props) {
          console.log('constructor')
          super(props)
          this.state = {
            isHot: true,
            wind: '微风'
          }
          this.cc = this.changeWeather.bind(this)
        }

        changeWeather() {
          console.log('changeWeather')
          // 资料拓展：
          // 1. 类中的所有方法都开启了局部的严格模式，（当前方法中的 this 指向 undefined）
          // 2. babel 是开启的严格模式
          // console.log('changeWeather-->this', this)

          this.setState({
            isHot: !this.state.isHot
          })
        }

        render() {
          console.log('render')
          const { isHot, wind } = this.state
          return (
            <p id="title" onClick={this.cc}>
              今天天气很{isHot ? '炎热' : '清爽'}，{wind}
            </p>
          )
        }
      }

      ReactDOM.render(<Weather />, document.getElementById('test'))

      // 解析：
      // 1. 因为类中的方法都放在了实例的原型上
      // 2. 所以在 constructor 的解析中，xx.bind(this) 就会把 xx 给绑定到当前的实例对象上（如果没有会在原型链上找）
      // 3. 把当前绑定实例后的某指向，赋值给当前对象上的某个方法（属性名），
      //    注意会发现当前实例对象上会多出一个该属性，且一般属性名为当前类的方法名
      // 4. 再调用时就会调用实例自身的当前属性

      // 注意：
      // 1. xx.bind() 方法返回的是一个新函数，所以要赋值调用
      // 2. 状态修改要用 setState() 方法，且更新是合并操作（类似 Object.assign()）
      // 3. constructor 只执行一次
      // 4. render 执行 1+n 次，n 为状态修改后的编译次数
      // 5. 实例中方法点几次调几次
    </script>
  </body>
</html>
